package org.ch02.test09.demo03;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 循环遍历Bean对象中的所有属性，
 * 获取其 getter 方法(readMethod)，
 * 并调用读出属性值
 *
 * @author CSY
 * @date 2025 - 03 - 25
 */
public class MainTest01 {
    public static void main(String[] args) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
        // 实例化 Person 对象 - JavaBean 对象
        Person bean = new Person("zing", 18);

        //获取到指定JavaBean对象所表示的BeanInfo对象
//        BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(), Object.class);
        BeanInfo beanInfo = Introspector.getBeanInfo(Person.class, Object.class);
        //根据BeanInfo对象获取到属性 getter/setter
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
// 循环遍历 Person 对象的所有属性
        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            // 获取 Person 对象的属性名称
            String propertyName = propertyDescriptor.getName();

            // 获取Person对象的写方法 -- getter方法
            Method readMethod = propertyDescriptor.getReadMethod();

            // 如果属性是可读的，则输出属性值 - getter方法
            if (readMethod != null) {
                Object value = readMethod.invoke(bean);
                System.out.println(propertyName + "=" + value);
            }
        }
    }
}
